package page.ineffable.photostorage.util;

import page.ineffable.photostorage.pojo.Photo;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;

/**
 * 图片水印工具类
 *
 * @author lqs2
 * @date 2018/10/31, Wed
 */
public class WaterMarkUtils {


    /**
     * 给图片增加文字水印
     *
     * @param bufImg 图像
     * @param img    图像
     * @param text   文字
     * @param color  颜色
     */
    private static void make(BufferedImage bufImg, Image img, String text, int loc, Color color, boolean plain) {
        Graphics2D g = bufImg.createGraphics();
        g.drawImage(img, 0, 0, bufImg.getWidth(), bufImg.getHeight(), null);
        g.setColor(color);
        int srcImgWidth = bufImg.getWidth(null);
        int srcImgHeight = bufImg.getHeight(null);
        Font font;
        if (plain) {
            font = new Font("楷体", Font.PLAIN, srcImgHeight / 20);
        } else {
            font = new Font("楷体", Font.ITALIC, srcImgHeight / 20);
        }
        g.setFont(font);
        int waterMarkLen = getWatermarkLength(text, g);
        int waterMarkHei = getWatermarkHeight(g);
        int x = srcImgWidth - waterMarkLen - 10;
        int y = srcImgHeight - 10;
        switch (loc) {
            case 0:
                x = 10;
                y = waterMarkHei + 10;
                break;
            case 1:
                y = waterMarkHei + 10;
                break;
            case 2:
                x = (srcImgWidth - waterMarkLen) / 2;
                y = (srcImgHeight - waterMarkHei) / 2 + waterMarkHei / 2;
                break;
            case 3:
                x = 10;
                break;
            case 4:
                break;
            default:
                break;
        }
        g.drawString(text, x, y);
        g.dispose();
    }

    /**
     * 获取水印的长度，单位像素
     *
     * @param waterMarkContent 水印内容
     * @param g                画笔
     * @return 长度
     **/
    private static int getWatermarkLength(String waterMarkContent, Graphics2D g) {
        return g.getFontMetrics(g.getFont()).charsWidth(waterMarkContent.toCharArray(), 0, waterMarkContent.length());
    }

    /**
     * 获取水印的高度，单位像素
     * 估计高度，以"图"的宽度作为其高度
     *
     * @param g 画笔
     * @return 长度
     **/
    private static int getWatermarkHeight(Graphics2D g) {
        String foo = "图";
        return g.getFontMetrics(g.getFont()).charsWidth(foo.toCharArray(), 0, foo.length());
    }


    /**
     * 给图片增加文字水印
     *
     * @param imgPath    要添加水印的图片路径
     * @param outImgPath 输出路径
     * @param text       文字
     * @param loc        水印的位置 0左上，1右上，2中心，3左下，4右上
     * @param plain      是否正常字体，如果false，则倾斜
     * @param photo      图像pojo
     * @return 是否添加成功
     */
    private static boolean addWaterMark(String imgPath, String outImgPath, String text, int loc, Color color, boolean plain, Photo photo) {
        try {
            // 读取原图片信息
            File imgFile = null;
            Image img = null;
            if (imgPath != null) {
                imgFile = new File(imgPath);
            }
            if (imgFile != null && imgFile.exists() && imgFile.isFile() && imgFile.canRead()) {
                img = ImageIO.read(imgFile);
            }
            assert img != null;
            int imgWidth = img.getWidth(null);
            int imgHeight = img.getHeight(null);
            // 加水印
            photo.setWidth(imgWidth);
            photo.setHeight(imgHeight);
            BufferedImage bufImg = new BufferedImage(imgWidth, imgHeight, BufferedImage.TYPE_INT_RGB);
            make(bufImg, img, text, loc, color, plain);
            // 输出图片
            FileOutputStream outImgStream = new FileOutputStream(outImgPath);
            ImageIO.write(bufImg, "jpg", outImgStream);
            outImgStream.flush();
            outImgStream.close();
            return true;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }

    /**
     * 添加文字水印，默认格式
     *
     * @param imgPath    -要添加水印的图片路径
     * @param outImgPath -输出路径
     * @param loc        水印的位置 0左上，1右上，2中心，3左下，4右上
     * @param col        水印的颜色 0,1,2,3,4 --> 白色，黑色，红色，绿色，蓝色
     * @param plain      是否正常字体，如果false，则倾斜
     * @return 是否添加成功
     **/
    private static boolean addWaterMark(String imgPath, String outImgPath, String text, int loc, int col, boolean plain, Photo photo) {
        Color color;
        switch (col) {
            case 0:
                color = new Color(255, 255, 255, 255);
                break;
            case 1:
                color = new Color(0, 0, 0, 255);
                break;
            case 2:
                color = new Color(255, 0, 0, 255);
                break;
            case 3:
                color = new Color(0, 255, 0, 255);
                break;
            case 4:
                color = new Color(0, 0, 255, 255);
                break;
            default:
                color = new Color(0, 0, 255, 128);
                break;
        }
        return addWaterMark(imgPath, outImgPath, text, loc, color, plain, photo);

    }


    /**
     * 外部添加图像水印调用方法
     *
     * @param photo         图像pojo
     * @param text          水印内容
     * @param loc           水印的位置 0左上，1右上，2中心，3左下，4右上
     * @param col           水印的颜色 0,1,2,3,4 --> 白色，黑色，红色，绿色，蓝色
     * @param plain         是否正常字体，如果false，则倾斜
     * @param imageRootPath 图像存储根路径
     * @return 是否添加成功
     **/
    public static boolean addWaterMark(Photo photo, String text, int loc, int col, boolean plain, String imageRootPath) {
        String relativePath = photo.getStoragePath();
        String newRelativePath = FileUtils.calWaterMarkImagePath(relativePath);
        photo.setMarkStoragePath(newRelativePath);
        return addWaterMark(imageRootPath + relativePath, imageRootPath + newRelativePath, text, loc, col, plain, photo);
    }
}
